Computer systems need a way to store and retrieve data from a variety of data devices, such as disk drives, printers, display screens, and scanners. In the past, each computer typically had its own directly-attached devices, which no other computer was capable of using. But, this was a cumbersome and expensive design because sharing data among computers was difficult and a particular device might stay idle and unused for lengthy periods. For example, a retail store might have multiple cash registers, but each cash register storing its own price/product data locally is less efficient and more cumbersome than every cash register accessing the same price/product data on one device, such as a disk drive.
In order to overcome the aforementioned cumbersome and expensive solutions, computers are connected in networks, and one computer (often called a client or a host) is allowed to store and retrieve data from another computer's (often called a server) devices. Many clients have a need for their data to always be available. For example, a retail store open twenty-four hours a day always needs its price/product data available. In order to ensure high availability of the data, some networks have built-in redundancy with multiple paths or connections through multiple servers to the device, so that if one path fails, the device may be still accessible through another path. But, these networks suffer from the problem that when one path to the device fails, the alternative path selected may be no better than the failing path. Since is takes time to switch from one path to another, if the alternative path is no better, performance suffers with no increase in data availability. Thus, there is a need for a technique that can better determine when to switch between paths.